﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

#Область ПрограммныйИнтерфейс

#Область ДляВызоваИзДругихПодсистем

// Задать настройки формы отчета.
//
// Параметры:
//   Форма - ФормаКлиентскогоПриложения
//         - Неопределено
//   КлючВарианта - Строка
//                - Неопределено
//   Настройки - см. ОтчетыКлиентСервер.НастройкиОтчетаПоУмолчанию
//
Процедура ОпределитьНастройкиФормы(Форма, КлючВарианта, Настройки) Экспорт
	
	Если КлючВарианта = "ПраваПользователяНаТаблицу" Тогда
		Настройки.РазрешеноИзменятьСтруктуру = Ложь;
	КонецЕсли;
	Настройки.ФормироватьСразу = Истина;
	Настройки.События.ПередЗагрузкойНастроекВКомпоновщик = Истина;
	Настройки.События.ПриСозданииНаСервере = Истина;
	Настройки.События.ПриОпределенииИспользуемыхТаблиц = Истина;
	
КонецПроцедуры

// См. ОтчетыПереопределяемый.ПриСозданииНаСервере
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт
	
	Если ЗначениеЗаполнено(Форма.НастройкиОтчета.ВариантСсылка) Тогда
		Форма.НастройкиОтчета.Наименование = Форма.НастройкиОтчета.ВариантСсылка;
	КонецЕсли;
	
	Если Форма.КонтекстВарианта = Метаданные.Справочники.Пользователи.ПолноеИмя()
	   И Форма.Параметры.Свойство("ПараметрКоманды") Тогда
		Если Форма.Параметры.ПараметрКоманды.Количество() > 1 Тогда
			Форма.КлючТекущегоВарианта = "ПраваПользователейНаТаблицы";
			Форма.Параметры.КлючВарианта = "ПраваПользователейНаТаблицы";
		Иначе
			Форма.КлючТекущегоВарианта = "ПраваПользователяНаТаблицы";
			Форма.Параметры.КлючВарианта = "ПраваПользователяНаТаблицы";
		КонецЕсли;
		Форма.ВариантыКонтекста.Очистить();
		Форма.ВариантыКонтекста.Добавить(Форма.КлючТекущегоВарианта);
	КонецЕсли;
	Если ЗначениеЗаполнено(Форма.КонтекстВарианта) Тогда
		Форма.ФормаПараметры.НачальныйКлючВарианта = Форма.КлючТекущегоВарианта;
		Форма.ФормаПараметры.Отбор.Вставить("НачальныйОтбор");
	КонецЕсли;
	
	Если УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда
		Форма.НастройкиОтчета.СхемаМодифицирована = Истина;
		Схема = ПолучитьИзВременногоХранилища(Форма.НастройкиОтчета.АдресСхемы);
		Поле = Схема.НаборыДанных.ПраваПользователей.Поля.Найти("ГруппаДоступа");
		Поле.Заголовок = НСтр("ru = 'Профиль пользователя'");
		Поле.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.ПрофилиГруппДоступа");
		Форма.НастройкиОтчета.АдресСхемы = ПоместитьВоВременноеХранилище(Схема, Форма.УникальныйИдентификатор);
	КонецЕсли;
	
КонецПроцедуры

// Вызывается перед загрузкой новых настроек. Используется для изменения СКД отчета.
//
// Параметры:
//   Контекст - Произвольный
//   КлючСхемы - Строка
//   КлючВарианта - Строка
//                - Неопределено
//   НовыеНастройкиКД - НастройкиКомпоновкиДанных
//                    - Неопределено
//   НовыеПользовательскиеНастройкиКД - ПользовательскиеНастройкиКомпоновкиДанных
//                                    - Неопределено
//
Процедура ПередЗагрузкойНастроекВКомпоновщик(Контекст, КлючСхемы, КлючВарианта, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД) Экспорт
	
	Если КлючСхемы <> "1" Тогда
		КлючСхемы = "1";
		Если ТипЗнч(Контекст) = Тип("ФормаКлиентскогоПриложения") И НовыеНастройкиКД <> Неопределено Тогда
			РеквизитыФормы = Новый Структура("КонтекстВарианта");
			ЗаполнитьЗначенияСвойств(РеквизитыФормы, Контекст);
			Вариант = НовыеНастройкиКД.ДополнительныеСвойства.КлючПредопределенногоВарианта;
			
			Если ЗначениеЗаполнено(РеквизитыФормы.КонтекстВарианта) Тогда
				Если Вариант = "ПраваПользователейНаТаблицу" Тогда
					ОбъектМетаданных = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Контекст.КонтекстВарианта, Ложь);
					Если ЗначениеЗаполнено(ОбъектМетаданных) Тогда
						ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбора(НовыеНастройкиКД.Отбор, "ОбъектМетаданных", ОбъектМетаданных,
							ВидСравненияКомпоновкиДанных.Равно, , Истина);
					КонецЕсли;
				ИначеЕсли Вариант = "ПраваПользователейНаТаблицы" Или Вариант = "ПраваПользователяНаТаблицы" Тогда
					Если Контекст.Параметры.Свойство("ПараметрКоманды") Тогда
						СписокПользователей = Новый СписокЗначений;
						СписокПользователей.ЗагрузитьЗначения(Контекст.Параметры.ПараметрКоманды);
						УстановитьОтбор("Пользователь", СписокПользователей, НовыеНастройкиКД, НовыеПользовательскиеНастройкиКД);
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
		КонецЕсли;
	КонецЕсли;
	
	Если Не Константы.ИспользоватьВнешнихПользователей.Получить() Тогда
		СхемаКомпоновкиДанных.Параметры.ВидПользователей.ОграничениеИспользования = Истина;
		Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
			МодульОтчетыСервер = ОбщегоНазначения.ОбщийМодуль("ОтчетыСервер");
			МодульОтчетыСервер.ПодключитьСхему(ЭтотОбъект, Контекст, СхемаКомпоновкиДанных, КлючСхемы);
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры

// Параметры:
//   КлючВарианта - Строка
//                - Неопределено
//   ИспользуемыеТаблицы - Массив из Строка
//
Процедура ПриОпределенииИспользуемыхТаблиц(КлючВарианта, ИспользуемыеТаблицы) Экспорт
	
	ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.ПраваРолей.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ПрофилиГруппДоступа.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.Справочники.ГруппыДоступа.ПолноеИмя());
	ИспользуемыеТаблицы.Добавить(Метаданные.РегистрыСведений.СоставыГруппПользователей.ПолноеИмя());
	
КонецПроцедуры

#КонецОбласти

#КонецОбласти

#Область ОбработчикиСобытий

// Параметры:
//  ДокументРезультат - ТабличныйДокумент
//  ДанныеРасшифровки - ДанныеРасшифровкиКомпоновкиДанных
//  СтандартнаяОбработка - Булево
//
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
	
	СтандартнаяОбработка = Ложь;
	
	Если Не ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		ТекстОшибки = НСтр("ru = 'Для использования отчета требуется внедрить подсистему Варианты отчетов.'");
		ВызватьИсключение ТекстОшибки;
	КонецЕсли;
	
	НастройкиКомпоновщика = КомпоновщикНастроек.ПолучитьНастройки();
	
	ПараметрВидПользователей = НастройкиКомпоновщика.ПараметрыДанных.Элементы.Найти("ВидПользователей");
	ПараметрПользователь     = НастройкиКомпоновщика.ПараметрыДанных.Элементы.Найти("Пользователь");
	
	Если ПараметрПользователь.Использование
	   И Не ЗначениеЗаполнено(ПараметрПользователь.Значение) Тогда
		
		ПараметрПользователь.Использование = Ложь;
	КонецЕсли;
	
	Если ПараметрПользователь.Использование Тогда
		ПараметрВидПользователей.Использование = Ложь;
	КонецЕсли;
	
	НастройкиПрав = НастройкиПравПоОбъектам();
	
	Если Не ЗначениеЗаполнено(НастройкиПрав.НастройкиПравЛегенда) Тогда
		ОтключитьГруппировки(НастройкиКомпоновщика,
			"НастройкиПрав,ЛегендаНастроекПрав,ДополнительныйЗаголовокТаблицы");
	КонецЕсли;
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, НастройкиКомпоновщика, ДанныеРасшифровки);
	
	ВнешниеНаборыДанных = Новый Структура;
	ВнешниеНаборыДанных.Вставить("ПраваПользователей",      ПраваПользователей());
	ВнешниеНаборыДанных.Вставить("НастройкиПравПоОбъектам", НастройкиПрав.НастройкиПравПоОбъектам);
	ВнешниеНаборыДанных.Вставить("НастройкиПравИерархия",   НастройкиПрав.НастройкиПравИерархия);
	ВнешниеНаборыДанных.Вставить("НастройкиПравЛегенда",    НастройкиПрав.НастройкиПравЛегенда);
	
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки);
	
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
	ПроцессорВывода.УстановитьДокумент(ДокументРезультат);
	
	ПроцессорВывода.Вывести(ПроцессорКомпоновки);
	
	ЗавершитьВывод(ДокументРезультат, ДанныеРасшифровки, НастройкиПрав);
	
КонецПроцедуры

Процедура ЗавершитьВывод(ДокументРезультат, ДанныеРасшифровки, НастройкиПрав)
	
	ГруппаДоступаЗаголовок = НСтр("ru = 'Группа доступа'");
	Если УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа() Тогда
		ГруппаДоступаЗаголовок = НСтр("ru = 'Профиль пользователя'");
	КонецЕсли;
	
	// АПК:163-выкл - №598.1 Использование допустимо, так как влияет на смысл.
	ТекстЕстьОграничение  = НСтр("ru = 'Доступно не всё'");
	// АПК:163-вкл.
	ТекстПравоНеНазначено = НСтр("ru = '●'");
	ТекстПравоРазрешено   = НСтр("ru = '✔'");
	ТекстПравоЗапрещено   = НСтр("ru = '✘'");
	ШрифтПравоНеНазначено = Неопределено;
	ШрифтПравоРазрешено   = Неопределено;
	ШрифтПравоЗапрещено   = Неопределено;
	ЦветПравоНеНазначено  = Метаданные.ЭлементыСтиля.НеназначенноеПравоДоступаЦвет.Значение;
	ЦветПравоРазрешено    = Метаданные.ЭлементыСтиля.РазрешенноеПравоДоступаЦвет.Значение;
	ЦветПравоЗапрещено    = Метаданные.ЭлементыСтиля.ЗапрещенноеПравоДоступаЦвет.Значение;
	ЦветПравоВычисленное  = Метаданные.ЭлементыСтиля.ВычисленноеПравоДоступаЦвет.Значение;
	РасшифровкиСтрок   = Новый Соответствие;
	РасшифровкиКолонок = Новый Соответствие;
	НастроенноеПравоДляПодпапок = ОписаниеКолонкиДляПодпапок().Заголовок;
	НетЛинии = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.НетЛинии);
	ТипИдентификаторРасшифровкиКомпоновкиДанных = Тип("ИдентификаторРасшифровкиКомпоновкиДанных");
	ВысотаТаблицы = ДокументРезультат.ВысотаТаблицы;
	ШиринаТаблицы = ДокументРезультат.ШиринаТаблицы;
	
	Для НомерСтроки = 1 По ВысотаТаблицы Цикл
		Для НомерКолонки = 1 По ШиринаТаблицы Цикл
			Область = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
			
			Расшифровка = Область.Расшифровка;
			Если ТипЗнч(Расшифровка) <> ТипИдентификаторРасшифровкиКомпоновкиДанных Тогда
				ТекстОбласти = Область.Текст;
				
				Если ТекстОбласти = "*" Тогда
					Область.Текст = "";
					Область.Примечание.Текст = ТекстЕстьОграничение;
					
				ИначеЕсли ТекстОбласти = "&ГруппаДоступаЗаголовок" Тогда
					Область.Текст = ГруппаДоступаЗаголовок;
					
				ИначеЕсли ТекстОбласти = "&ВладелецНастроекЗаголовок" Тогда
					Область.Текст = НастройкиПрав.ВладелецНастроекЗаголовок;
				КонецЕсли;
				
				Продолжить;
			КонецЕсли;
			
			ЗначенияПолей = ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля();
			
			Если ЗначенияПолей.Найти("Право") <> Неопределено
			   И ЗначенияПолей.Найти("Право").Значение > 0
			   И ЗначенияПолей.Найти("ПравоБезОграничения") <> Неопределено
			   И ЗначенияПолей.Найти("Право").Значение
			     > ЗначенияПолей.Найти("ПравоБезОграничения").Значение
			 Или ЗначенияПолей.Найти("ПравоПросмотр") <> Неопределено
			   И ЗначенияПолей.Найти("ПравоПросмотр").Значение = Истина
			   И ЗначенияПолей.Найти("ПравоЧтениеБезОграничения").Значение = Ложь
			 Или ЗначенияПолей.Найти("ПравоРедактирование") <> Неопределено
			   И ЗначенияПолей.Найти("ПравоРедактирование").Значение = Истина
			   И ЗначенияПолей.Найти("ПравоИзменениеБезОграничения").Значение = Ложь
			 Или ЗначенияПолей.Найти("ПравоИнтерактивноеДобавление") <> Неопределено
			   И ЗначенияПолей.Найти("ПравоИнтерактивноеДобавление").Значение = Истина
			   И ЗначенияПолей.Найти("ПравоДобавлениеБезОграничения").Значение = Ложь Тогда
				
				Область.Примечание.Текст = ТекстЕстьОграничение;
				
			ИначеЕсли ЗначенияПолей.Найти("ЗначениеПрава") <> Неопределено Тогда
				ЗначениеПрава = ЗначенияПолей.Найти("ЗначениеПрава").Значение;
				Если ЗначениеПрава = Null Тогда
					ЗначениеПрава = 0;
					ЭтоВладелецНастроек = РасшифровкиСтрок.Получить(НомерСтроки).Найти("ЭтоВладелецНастроек").Значение;
					НастроенноеПраво = РасшифровкиКолонок.Получить(НомерКолонки).Найти("НастроенноеПраво").Значение;
				Иначе
					ЭтоВладелецНастроек = ЗначенияПолей.Найти("ЭтоВладелецНастроек").Значение;
					Если ЗначениеПрава = 0 Тогда
						НастроенноеПраво = ЗначенияПолей.Найти("НастроенноеПраво").Значение;
					КонецЕсли;
				КонецЕсли;
				Если ЗначениеПрава = 0 Тогда
					Если ЭтоВладелецНастроек И НастроенноеПраво <> НастроенноеПравоДляПодпапок Тогда
						ЗначениеПрава = 2;
					ИначеЕсли НастроенноеПраво <> НастроенноеПравоДляПодпапок Тогда
						Область.Текст      = ТекстПравоНеНазначено;
						Область.Шрифт      = ШрифтПравоНеНазначено;
						Область.ЦветТекста = ЦветПравоНеНазначено;
					КонецЕсли;
				КонецЕсли;
				Если ЗначениеПрава = 1 Тогда
					Область.Текст      = ТекстПравоРазрешено;
					Область.Шрифт      = ШрифтПравоРазрешено;
					Область.ЦветТекста = ?(ЭтоВладелецНастроек, ЦветПравоВычисленное, ЦветПравоРазрешено);
					
				ИначеЕсли ЗначениеПрава = 2 Тогда
					Область.Текст      = ТекстПравоЗапрещено;
					Область.Шрифт      = ШрифтПравоЗапрещено;
					Область.ЦветТекста = ?(ЭтоВладелецНастроек, ЦветПравоВычисленное, ЦветПравоЗапрещено);
				КонецЕсли;
				
			ИначеЕсли ЗначенияПолей.Найти("ВладелецИлиПользовательНастроек") <> Неопределено Тогда
				РасшифровкиСтрок.Вставить(НомерСтроки, ЗначенияПолей);
				Если ШрифтПравоНеНазначено = Неопределено Тогда
					ШрифтПравоНеНазначено = Область.Шрифт;
					//@skip-check new-font - Используется стандартный шрифт, увеличенный до 120% с наклоном.
					ШрифтПравоРазрешено   = Новый Шрифт(ШрифтПравоНеНазначено,,, Истина,,,, 120);
					ШрифтПравоЗапрещено   = ШрифтПравоРазрешено;
				КонецЕсли;
				Отступ = (ЗначенияПолей.Найти("Уровень").Значение - 1) * 2;
				ОбластьСтроки = ДокументРезультат.Область(НомерСтроки, , НомерСтроки);
				ОбластьСтроки.СоздатьФорматСтрок();
				ОбластьСправа = ДокументРезультат.Область(НомерСтроки, НомерКолонки);
				ОбластьСлева  = ДокументРезультат.Область(НомерСтроки, НомерКолонки - 1);
				ОбластьСправа.ГраницаСлева = НетЛинии;
				ОбластьСлева.ГраницаСправа = НетЛинии;
				ОбластьСправа.ШиринаКолонки = Область.ШиринаКолонки + ОбластьСлева.ШиринаКолонки - Отступ;
				ОбластьСлева.ШиринаКолонки = Отступ;
				
			ИначеЕсли ЗначенияПолей.Найти("НастроенноеПраво") <> Неопределено Тогда
				РасшифровкиКолонок.Вставить(НомерКолонки, ЗначенияПолей);
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Функция ТаблицыОтчетов()
	
	Результат = ПустаяКоллекцияТаблицОтчетов();
	ОписаниеТиповИдентификатора = ОписаниеТиповИдентификатора();
	
	ВыбранныйОтчет = ВыбранныйОтчет();
	ИспользуемыеТаблицы = Неопределено;
	
	Если ЗначениеЗаполнено(ВыбранныйОтчет)
		И КомпоновщикНастроек.ПользовательскиеНастройки.ДополнительныеСвойства.Свойство("ИспользуемыеТаблицы", ИспользуемыеТаблицы)
		И ИспользуемыеТаблицы <> Неопределено Тогда 
		
		ИдентификаторыОбъектовМетаданных =
			ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ИспользуемыеТаблицы, Ложь);
		
		Для Каждого Таблица Из ИспользуемыеТаблицы Цикл
			ИдентификаторТаблицы = ИдентификаторыОбъектовМетаданных[Таблица];
			СтрокаТаблицы = Результат.Добавить();
			СтрокаТаблицы.Отчет = ВыбранныйОтчет;
			СтрокаТаблицы.ОбъектМетаданных = ИдентификаторТаблицы;
		КонецЦикла;
		
		Если Не ЗначениеЗаполнено(Результат) Тогда
			СтрокаТаблицы = Результат.Добавить();
			СтрокаТаблицы.Отчет = ВыбранныйОтчет;
			СтрокаТаблицы.ОбъектМетаданных = Неопределено;
		КонецЕсли;
		
		Возврат Результат;
		
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ВыбранныйОтчет)
	   И ОписаниеТиповИдентификатора.СодержитТип(ТипЗнч(ВыбранныйОтчет)) Тогда
		
		ОбъектМетаданныхВыбранныйОтчет =
			ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВыбранныйОтчет, Ложь);
	КонецЕсли;
	
	ТаблицыОтчетов = Новый ТаблицаЗначений;
	ТаблицыОтчетов.Колонки.Добавить("Отчет");
	ТаблицыОтчетов.Колонки.Добавить("ОбъектМетаданных");
	
	Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ВариантыОтчетов") Тогда
		МодульВариантыОтчетов = ОбщегоНазначения.ОбщийМодуль("ВариантыОтчетов");
		ВладельцыТаблиц = Новый Соответствие;
		Для Каждого ОбъектМетаданныхОтчет Из Метаданные.Отчеты Цикл
			Если ТипЗнч(ОбъектМетаданныхВыбранныйОтчет) = Тип("ОбъектМетаданных")
			   И ОбъектМетаданныхОтчет <> ОбъектМетаданныхВыбранныйОтчет Тогда
				Продолжить;
			КонецЕсли;
			Если Не ПравоДоступа("Просмотр", ОбъектМетаданныхОтчет) Тогда
				Продолжить;
			КонецЕсли;
			ИспользуемыеТаблицы = МодульВариантыОтчетов.ИспользуемыеТаблицыОтчета(ОбъектМетаданныхОтчет);
			
			Для Каждого ИмяТаблицы Из ИспользуемыеТаблицы Цикл
				ИспользуемаяТаблица = ВладельцыТаблиц[ИмяТаблицы];
				Если ИспользуемаяТаблица = Неопределено Тогда
					ВладелецТаблицы = ИмяТаблицы;
					ЧастиСтроки = СтрРазделить(ВладелецТаблицы, ".", Истина);
					Если ЧастиСтроки.Количество() = 1 Тогда
						Продолжить;
					КонецЕсли;
					Если ЧастиСтроки.Количество() > 2 Тогда
						ВладелецТаблицы = ЧастиСтроки[0] + "." + ЧастиСтроки[1];
					КонецЕсли;
					ВладельцыТаблиц.Вставить(ИмяТаблицы, ВладелецТаблицы);
					ИспользуемаяТаблица = ВладелецТаблицы;
				КонецЕсли;
				
				СтрокаТаблицы = ТаблицыОтчетов.Добавить();
				СтрокаТаблицы.Отчет = ОбъектМетаданныхОтчет.ПолноеИмя();
				СтрокаТаблицы.ОбъектМетаданных = ИспользуемаяТаблица;
			КонецЦикла;
		КонецЦикла;
		ТаблицыОтчетов.Свернуть("Отчет, ОбъектМетаданных");
	КонецЕсли;
	
	ИменаОбъектовМетаданных = ТаблицыОтчетов.ВыгрузитьКолонку("ОбъектМетаданных");
	ОтчетыСТаблицами = Новый Соответствие;
	Для Каждого ОбъектМетаданныхОтчет Из Метаданные.Отчеты Цикл
		Если ТипЗнч(ОбъектМетаданныхВыбранныйОтчет) = Тип("ОбъектМетаданных")
		   И ОбъектМетаданныхОтчет <> ОбъектМетаданныхВыбранныйОтчет Тогда
			Продолжить;
		КонецЕсли;
		ПолноеИмяОтчета = ОбъектМетаданныхОтчет.ПолноеИмя();
		ОтчетыСТаблицами.Вставить(ПолноеИмяОтчета, Ложь);
		ИменаОбъектовМетаданных.Добавить(ПолноеИмяОтчета);
	КонецЦикла;
	
	ИдентификаторыОбъектовМетаданных =
		ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ИменаОбъектовМетаданных, Ложь);
	
	Для Каждого СтрокаТаблицы Из ТаблицыОтчетов Цикл
		ИдентификаторТаблицы = ИдентификаторыОбъектовМетаданных[СтрокаТаблицы.ОбъектМетаданных];
		Если Не ЗначениеЗаполнено(ИдентификаторТаблицы) Тогда
			Продолжить;
		КонецЕсли;
		НоваяСтрока = Результат.Добавить();
		НоваяСтрока.Отчет            = ИдентификаторыОбъектовМетаданных[СтрокаТаблицы.Отчет];
		НоваяСтрока.ОбъектМетаданных = ИдентификаторТаблицы;
		ОтчетыСТаблицами.Вставить(СтрокаТаблицы.Отчет, Истина);
	КонецЦикла;
	
	Для Каждого КлючИЗначение Из ОтчетыСТаблицами Цикл
		Если КлючИЗначение.Значение Тогда
			Продолжить;
		КонецЕсли;
		НоваяСтрока = Результат.Добавить();
		НоваяСтрока.Отчет = ИдентификаторыОбъектовМетаданных[КлючИЗначение.Ключ];
		НоваяСтрока.ОбъектМетаданных = Неопределено;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ОписаниеТиповИдентификатора()
	
	Возврат Новый ОписаниеТипов("СправочникСсылка.ИдентификаторыОбъектовМетаданных,
		|СправочникСсылка.ИдентификаторыОбъектовРасширений");
	
КонецФункции

Функция ПустаяКоллекцияТаблицОтчетов()
	
	ОписаниеТиповИдентификатора = ОписаниеТиповИдентификатора();
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("Отчет", ОписаниеТиповИдентификатора);
	Результат.Колонки.Добавить("ОбъектМетаданных", ОписаниеТиповИдентификатора);
	
	Возврат Результат;
	
КонецФункции

Функция ПраваРолейНаОтчеты()
	
	Результат = ПустаяКоллекцияПравРолейНаОтчеты();
	ОписаниеТиповИдентификатора = ОписаниеТиповИдентификатора();
	
	ВыбранныйОтчет = ВыбранныйОтчет();
	
	Если ЗначениеЗаполнено(ВыбранныйОтчет)
	   И ОписаниеТиповИдентификатора.СодержитТип(ТипЗнч(ВыбранныйОтчет)) Тогда
		
		ОбъектМетаданныхВыбранныйОтчет =
			ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(ВыбранныйОтчет, Ложь);
	КонецЕсли;
	
	ИменаОбъектовМетаданных = Новый Массив;
	Для Каждого ОбъектМетаданныхРоль Из Метаданные.Роли Цикл
		ИменаОбъектовМетаданных.Добавить(ОбъектМетаданныхРоль.ПолноеИмя());
	КонецЦикла;
	Для Каждого ОбъектМетаданныхОтчет Из Метаданные.Отчеты Цикл
		Если ТипЗнч(ОбъектМетаданныхВыбранныйОтчет) = Тип("ОбъектМетаданных")
		   И ОбъектМетаданныхОтчет <> ОбъектМетаданныхВыбранныйОтчет Тогда
			Продолжить;
		КонецЕсли;
		ИменаОбъектовМетаданных.Добавить(ОбъектМетаданныхОтчет.ПолноеИмя());
	КонецЦикла;
	
	ИдентификаторыОбъектовМетаданных =
		ОбщегоНазначения.ИдентификаторыОбъектовМетаданных(ИменаОбъектовМетаданных, Ложь);
	
	Для Каждого ОбъектМетаданныхОтчет Из Метаданные.Отчеты Цикл
		Если ТипЗнч(ОбъектМетаданныхВыбранныйОтчет) = Тип("ОбъектМетаданных")
		   И ОбъектМетаданныхОтчет <> ОбъектМетаданныхВыбранныйОтчет Тогда
			Продолжить;
		КонецЕсли;
		Для Каждого ОбъектМетаданныхРоль Из Метаданные.Роли Цикл
			Если ПравоДоступа("Просмотр", ОбъектМетаданныхОтчет, ОбъектМетаданныхРоль) Тогда
				СтрокаТаблицы = Результат.Добавить();
				СтрокаТаблицы.Отчет = ИдентификаторыОбъектовМетаданных[ОбъектМетаданныхОтчет.ПолноеИмя()];
				СтрокаТаблицы.Роль  = ИдентификаторыОбъектовМетаданных[ОбъектМетаданныхРоль.ПолноеИмя()];
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ПустаяКоллекцияПравРолейНаОтчеты()
	
	ОписаниеТиповИдентификатора = ОписаниеТиповИдентификатора();
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("Отчет", ОписаниеТиповИдентификатора);
	Результат.Колонки.Добавить("Роль", ОписаниеТиповИдентификатора);
	
	Возврат Результат;
	
КонецФункции

Функция ПраваПользователей()
	
	ТекстЗапросаОбщий =
	"ВЫБРАТЬ
	|	ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных,
	|	ПраваРолейРасширений.Роль КАК Роль,
	|	ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ПраваРолейРасширений.ВидИзмененияСтроки КАК ВидИзмененияСтроки
	|ПОМЕСТИТЬ ПраваРолейРасширений
	|ИЗ
	|	&ПраваРолейРасширений КАК ПраваРолейРасширений
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПраваРолейРасширений.ОбъектМетаданных КАК ОбъектМетаданных,
	|	ПраваРолейРасширений.Роль КАК Роль,
	|	ПраваРолейРасширений.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваРолейРасширений.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваРолейРасширений.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваРолейРасширений.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваРолейРасширений.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваРолейРасширений.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление
	|ПОМЕСТИТЬ ПраваРолей
	|ИЗ
	|	ПраваРолейРасширений КАК ПраваРолейРасширений
	|ГДЕ
	|	ПраваРолейРасширений.ВидИзмененияСтроки = 1
	|	И ПраваРолейРасширений.ПравоПросмотр = ИСТИНА
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ПраваРолей.ОбъектМетаданных,
	|	ПраваРолей.Роль,
	|	ПраваРолей.ПравоЧтениеБезОграничения,
	|	ПраваРолей.ПравоИзменениеБезОграничения,
	|	ПраваРолей.ПравоДобавлениеБезОграничения,
	|	ПраваРолей.ПравоПросмотр,
	|	ПраваРолей.ПравоРедактирование,
	|	ПраваРолей.ПравоИнтерактивноеДобавление
	|ИЗ
	|	РегистрСведений.ПраваРолей КАК ПраваРолей
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПраваРолейРасширений КАК ПраваРолейРасширений
	|		ПО ПраваРолей.ОбъектМетаданных = ПраваРолейРасширений.ОбъектМетаданных
	|			И ПраваРолей.Роль = ПраваРолейРасширений.Роль
	|ГДЕ
	|	ПраваРолейРасширений.ОбъектМетаданных ЕСТЬ NULL
	|	И ПраваРолей.ПравоПросмотр = ИСТИНА
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Роль
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПрофилиГруппДоступаРоли.Ссылка КАК Профиль,
	|	ПраваРолей.ОбъектМетаданных КАК Таблица,
	|	МАКСИМУМ(ПраваРолей.ПравоЧтениеБезОграничения) КАК ПравоЧтениеБезОграничения,
	|	МАКСИМУМ(ПраваРолей.ПравоИзменениеБезОграничения) КАК ПравоИзменениеБезОграничения,
	|	МАКСИМУМ(ПраваРолей.ПравоДобавлениеБезОграничения) КАК ПравоДобавлениеБезОграничения,
	|	МАКСИМУМ(ПраваРолей.ПравоПросмотр) КАК ПравоПросмотр,
	|	МАКСИМУМ(ПраваРолей.ПравоРедактирование) КАК ПравоРедактирование,
	|	МАКСИМУМ(ПраваРолей.ПравоИнтерактивноеДобавление) КАК ПравоИнтерактивноеДобавление
	|ПОМЕСТИТЬ ПраваПрофилейНаТаблицы
	|ИЗ
	|	ПраваРолей КАК ПраваРолей
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
	|		ПО ПраваРолей.Роль = ПрофилиГруппДоступаРоли.Роль
	|			И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления)
	|ГДЕ
	|	&ОтборПравПоТаблицам
	|
	|СГРУППИРОВАТЬ ПО
	|	ПрофилиГруппДоступаРоли.Ссылка,
	|	ПраваРолей.ОбъектМетаданных
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Таблица";
	
	ТекстЗапросаБезГруппировкиПоОтчетам =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПраваПрофилей.Таблица КАК ОбъектМетаданных,
	|	ВЫБОР
	|		КОГДА &УпрощенныйИнтерфейсНастройкиПравДоступа
	|			ТОГДА ГруппыДоступа.Профиль
	|		ИНАЧЕ ГруппыДоступа.Ссылка
	|	КОНЕЦ КАК ГруппаДоступа,
	|	ПраваПрофилей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваПрофилей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваПрофилей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоИнтерактивноеДобавление
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоДобавлениеБезОграничения
	|						ТОГДА 3
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		КОГДА ПраваПрофилей.ПравоРедактирование
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоИзменениеБезОграничения
	|						ТОГДА 2
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		КОГДА ПраваПрофилей.ПравоПросмотр
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоЧтениеБезОграничения
	|						ТОГДА 1
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ПравоБезОграничения,
	|	ПраваПрофилей.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваПрофилей.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваПрофилей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоИнтерактивноеДобавление
	|			ТОГДА 3
	|		КОГДА ПраваПрофилей.ПравоРедактирование
	|			ТОГДА 2
	|		КОГДА ПраваПрофилей.ПравоПросмотр
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Право,
	|	СоставыГруппПользователей.Пользователь КАК Пользователь,
	|	ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен
	|ИЗ
	|	ПраваПрофилейНаТаблицы КАК ПраваПрофилей
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
	|		ПО (ГруппыДоступа.Профиль = ПраваПрофилей.Профиль)
	|			И (НЕ ГруппыДоступа.ПометкаУдаления)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК УчастникиГруппДоступа
	|		ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|		ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь)
	|			И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)
	|			И (&УсловиеОтбораПоПользователям)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
	|		ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)";
	
	ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало =
	"ВЫБРАТЬ
	|	ГруппыДоступа.Профиль КАК Профиль,
	|	ГруппыДоступа.Ссылка КАК ГруппаДоступа
	|ПОМЕСТИТЬ ГруппыДоступаПользователей
	|ИЗ
	|	Справочник.ГруппыДоступа КАК ГруппыДоступа
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК УчастникиГруппДоступа
	|		ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка)
	|			И (НЕ ГруппыДоступа.ПометкаУдаления)
	|			И (ГруппыДоступа.Профиль В
	|				(ВЫБРАТЬ РАЗЛИЧНЫЕ
	|					ПраваПрофилей.Профиль
	|				ИЗ
	|					ПраваПрофилейНаТаблицы КАК ПраваПрофилей))
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|		ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь)
	|			И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)
	|			И (&УсловиеОтбораПоПользователям)";
	
	ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграниченийПоСтарому =
	"ВЫБРАТЬ
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.Представление КАК ВидДоступаПредставление,
	|	ВидыОграниченийПрав.Право КАК Право
	|ПОМЕСТИТЬ ВидыОграниченийПравИсходные
	|ИЗ
	|	&ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление КАК ВидДоступаПредставление,
	|	МАКСИМУМ(ВидыОграниченийПрав.Право = ""Чтение"") КАК ПравоЧтение,
	|	МАКСИМУМ(ВидыОграниченийПрав.Право = ""Изменение"") КАК ПравоИзменение
	|ПОМЕСТИТЬ ВидыОграниченийПравПреобразованные
	|ИЗ
	|	ВидыОграниченийПравИсходные КАК ВидыОграниченийПрав
	|
	|СГРУППИРОВАТЬ ПО
	|	ВидыОграниченийПрав.Таблица,
	|	ВидыОграниченийПрав.ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЛОЖЬ КАК ДляВнешнихПользователей,
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление КАК ВидДоступаПредставление,
	|	ВидыОграниченийПрав.ПравоЧтение КАК ПравоЧтение,
	|	ВидыОграниченийПрав.ПравоИзменение КАК ПравоИзменение
	|ПОМЕСТИТЬ ВидыОграниченийПрав
	|ИЗ
	|	ВидыОграниченийПравПреобразованные КАК ВидыОграниченийПрав
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) <> ТИП(Справочник.ВнешниеПользователи)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ИСТИНА,
	|	ВидыОграниченийПрав.Таблица,
	|	ВидыОграниченийПрав.ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление,
	|	ВидыОграниченийПрав.ПравоЧтение,
	|	ВидыОграниченийПрав.ПравоИзменение
	|ИЗ
	|	ВидыОграниченийПравПреобразованные КАК ВидыОграниченийПрав
	|ГДЕ
	|	ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) <> ТИП(Справочник.Пользователи)";
	
	ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграниченийПоНовому =
	"ВЫБРАТЬ
	|	ВидыОграниченийПрав.ДляВнешнихПользователей КАК ДляВнешнихПользователей,
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.Представление КАК ВидДоступаПредставление,
	|	ВидыОграниченийПрав.Право КАК Право
	|ПОМЕСТИТЬ ВидыОграниченийПравИсходные
	|ИЗ
	|	&ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВидыОграниченийПрав.ДляВнешнихПользователей КАК ДляВнешнихПользователей,
	|	ВидыОграниченийПрав.Таблица КАК Таблица,
	|	ВидыОграниченийПрав.ВидДоступа КАК ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление КАК ВидДоступаПредставление,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
	|			ТОГДА ЛОЖЬ
	|		КОГДА ВидыОграниченийПрав.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ МАКСИМУМ(ВидыОграниченийПрав.Право = ""Чтение"")
	|	КОНЕЦ КАК ПравоЧтение,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
	|			ТОГДА ЛОЖЬ
	|		КОГДА ВидыОграниченийПрав.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен)
	|			ТОГДА ИСТИНА
	|		ИНАЧЕ МАКСИМУМ(ВидыОграниченийПрав.Право = ""Изменение"")
	|	КОНЕЦ КАК ПравоИзменение
	|ПОМЕСТИТЬ ВидыОграниченийПрав
	|ИЗ
	|	ВидыОграниченийПравИсходные КАК ВидыОграниченийПрав
	|
	|СГРУППИРОВАТЬ ПО
	|	ВидыОграниченийПрав.ДляВнешнихПользователей,
	|	ВидыОграниченийПрав.Таблица,
	|	ВидыОграниченийПрав.ВидДоступа,
	|	ВидыОграниченийПрав.ВидДоступаПредставление";
	
	ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаКонец =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ВидыИЗначенияДоступа.ГруппаДоступа КАК ГруппаДоступа,
	|	ВидыИЗначенияДоступа.ВидДоступа КАК ВидДоступа,
	|	ВидыИЗначенияДоступа.ВсеРазрешены КАК ВсеРазрешены,
	|	ВидыИЗначенияДоступа.ЗначениеДоступа КАК ЗначениеДоступа
	|ПОМЕСТИТЬ ВидыИЗначенияДоступа
	|ИЗ
	|	(ВЫБРАТЬ
	|		ГруппыДоступаПользователей.ГруппаДоступа КАК ГруппаДоступа,
	|		ГруппыДоступаВидыДоступа.ВидДоступа КАК ВидДоступа,
	|		ГруппыДоступаВидыДоступа.ВсеРазрешены КАК ВсеРазрешены,
	|		ЕСТЬNULL(ГруппыДоступаЗначенияДоступа.ЗначениеДоступа, НЕОПРЕДЕЛЕНО) КАК ЗначениеДоступа
	|	ИЗ
	|		ГруппыДоступаПользователей КАК ГруппыДоступаПользователей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ВидыДоступа КАК ГруппыДоступаВидыДоступа
	|			ПО (ГруппыДоступаВидыДоступа.Ссылка = ГруппыДоступаПользователей.ГруппаДоступа)
	|			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.ЗначенияДоступа КАК ГруппыДоступаЗначенияДоступа
	|			ПО (ГруппыДоступаЗначенияДоступа.Ссылка = ГруппыДоступаВидыДоступа.Ссылка)
	|				И (ГруппыДоступаЗначенияДоступа.ВидДоступа = ГруппыДоступаВидыДоступа.ВидДоступа)
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ГруппыДоступаПользователей.ГруппаДоступа,
	|		ПрофилиГруппДоступаВидыДоступа.ВидДоступа,
	|		ПрофилиГруппДоступаВидыДоступа.ВсеРазрешены,
	|		ЕСТЬNULL(ПрофилиГруппДоступаЗначенияДоступа.ЗначениеДоступа, НЕОПРЕДЕЛЕНО)
	|	ИЗ
	|		ГруппыДоступаПользователей КАК ГруппыДоступаПользователей
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ВидыДоступа КАК ПрофилиГруппДоступаВидыДоступа
	|			ПО (ПрофилиГруппДоступаВидыДоступа.Ссылка = ГруппыДоступаПользователей.Профиль)
	|			ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.ЗначенияДоступа КАК ПрофилиГруппДоступаЗначенияДоступа
	|			ПО (ПрофилиГруппДоступаЗначенияДоступа.Ссылка = ПрофилиГруппДоступаВидыДоступа.Ссылка)
	|				И (ПрофилиГруппДоступаЗначенияДоступа.ВидДоступа = ПрофилиГруппДоступаВидыДоступа.ВидДоступа)
	|	ГДЕ
	|		ПрофилиГруппДоступаВидыДоступа.Предустановленный) КАК ВидыИЗначенияДоступа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПустыеСсылкиЗначенийДоступа.ПустаяСсылка КАК ПустаяСсылка,
	|	ПустыеСсылкиЗначенийДоступа.Представление КАК Представление
	|ПОМЕСТИТЬ ПустыеСсылкиЗначенийДоступа
	|ИЗ
	|	&ПустыеСсылкиЗначенийДоступа КАК ПустыеСсылкиЗначенийДоступа
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПраваПрофилей.Таблица КАК ОбъектМетаданных,
	|	ВЫБОР
	|		КОГДА &УпрощенныйИнтерфейсНастройкиПравДоступа
	|			ТОГДА ГруппыДоступа.Профиль
	|		ИНАЧЕ ГруппыДоступа.Ссылка
	|	КОНЕЦ КАК ГруппаДоступа,
	|	ПраваПрофилей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваПрофилей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваПрофилей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваПрофилей.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваПрофилей.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваПрофилей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоЧтениеБезОграничения
	|			ТОГДА ИСТИНА
	|		КОГДА НЕ ПраваПрофилей.ПравоПросмотр
	|			ТОГДА ЛОЖЬ
	|		КОГДА НЕ ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПрав.ПравоЧтение
	|		КОГДА НЕ ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПравБезусловные.ПравоЧтение
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВидДоступаПравоЧтениеБезОграничения,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоИзменениеБезОграничения
	|			ТОГДА ИСТИНА
	|		КОГДА НЕ ПраваПрофилей.ПравоРедактирование
	|			ТОГДА ЛОЖЬ
	|		КОГДА НЕ ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПрав.ПравоИзменение
	|		КОГДА НЕ ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПравБезусловные.ПравоИзменение
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВидДоступаПравоИзменениеБезОграничения,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоДобавлениеБезОграничения
	|			ТОГДА ИСТИНА
	|		КОГДА НЕ ПраваПрофилей.ПравоИнтерактивноеДобавление
	|			ТОГДА ЛОЖЬ
	|		КОГДА НЕ ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПрав.ПравоИзменение
	|		КОГДА НЕ ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА НЕ ВидыОграниченийПравБезусловные.ПравоИзменение
	|		ИНАЧЕ ЛОЖЬ
	|	КОНЕЦ КАК ВидДоступаПравоДобавлениеБезОграничения,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|				И ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ ПраваПрофилей.ПравоПросмотр
	|	КОНЕЦ КАК ВидДоступаПравоПросмотр,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|				И ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ ПраваПрофилей.ПравоРедактирование
	|	КОНЕЦ КАК ВидДоступаПравоРедактирование,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|				И ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ЛОЖЬ
	|		ИНАЧЕ ПраваПрофилей.ПравоИнтерактивноеДобавление
	|	КОНЕЦ КАК ВидДоступаПравоИнтерактивноеДобавление,
	|	ВЫБОР
	|		КОГДА НЕ ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ВидыОграниченийПрав.ВидДоступа
	|		КОГДА НЕ ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ВидыОграниченийПравБезусловные.ВидДоступа
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ВидДоступа,
	|	ВЫБОР
	|		КОГДА НЕ ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА ВидыОграниченийПрав.ВидДоступаПредставление + ВЫБОР
	|					КОГДА ВидыИЗначенияДоступа.ВсеРазрешены ЕСТЬ NULL
	|						ТОГДА """"
	|					КОГДА ВидыИЗначенияДоступа.ВсеРазрешены = ЛОЖЬ
	|						ТОГДА ВЫБОР
	|								КОГДА ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) = ТИП(Справочник.Пользователи)
	|										ИЛИ ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) = ТИП(Справочник.ВнешниеПользователи)
	|									ТОГДА &ТекстРазрешенныеПользователи
	|								ИНАЧЕ &ТекстРазрешенные
	|							КОНЕЦ
	|					ИНАЧЕ ВЫБОР
	|							КОГДА ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) = ТИП(Справочник.Пользователи)
	|									ИЛИ ТИПЗНАЧЕНИЯ(ВидыОграниченийПрав.ВидДоступа) = ТИП(Справочник.ВнешниеПользователи)
	|								ТОГДА &ТекстЗапрещенныеПользователи
	|							ИНАЧЕ &ТекстЗапрещенные
	|						КОНЕЦ
	|				КОНЕЦ
	|		ИНАЧЕ ВЫБОР
	|				КОГДА ПраваПрофилей.ПравоПросмотр
	|							И НЕ ПраваПрофилей.ПравоЧтениеБезОграничения
	|						ИЛИ ПраваПрофилей.ПравоРедактирование
	|							И НЕ ПраваПрофилей.ПравоИзменениеБезОграничения
	|						ИЛИ ПраваПрофилей.ПравоИнтерактивноеДобавление
	|							И НЕ ПраваПрофилей.ПравоДобавлениеБезОграничения
	|					ТОГДА ВЫБОР
	|							КОГДА НЕ ВидыОграниченийПравБезусловные.ВидДоступа ЕСТЬ NULL
	|								ТОГДА ВидыОграниченийПравБезусловные.ВидДоступаПредставление
	|							ИНАЧЕ &ТекстОграничениеБезВидовДоступа
	|						КОНЕЦ
	|				ИНАЧЕ &ТекстБезОграничения
	|			КОНЕЦ
	|	КОНЕЦ КАК ВидДоступаПредставление,
	|	ЕСТЬNULL(ВидыИЗначенияДоступа.ВсеРазрешены, ЛОЖЬ) КАК ВсеРазрешены,
	|	ВЫБОР
	|		КОГДА ВидыОграниченийПрав.ВидДоступа ЕСТЬ NULL
	|			ТОГДА """"
	|		КОГДА НЕ ПустыеСсылкиЗначенийДоступа.Представление ЕСТЬ NULL
	|			ТОГДА ПустыеСсылкиЗначенийДоступа.Представление
	|		КОГДА ВидыИЗначенияДоступа.ЗначениеДоступа ЕСТЬ NULL
	|				ИЛИ ВидыИЗначенияДоступа.ЗначениеДоступа = НЕОПРЕДЕЛЕНО
	|			ТОГДА ВЫБОР
	|					КОГДА ВидыИЗначенияДоступа.ВсеРазрешены
	|						ТОГДА &ТекстВсеРазрешены
	|					ИНАЧЕ &ТекстВсеЗапрещены
	|				КОНЕЦ
	|		ИНАЧЕ ВидыИЗначенияДоступа.ЗначениеДоступа
	|	КОНЕЦ КАК ЗначениеДоступа,
	|	СоставыГруппПользователей.Пользователь КАК Пользователь,
	|	ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен
	|ИЗ
	|	ПраваПрофилейНаТаблицы КАК ПраваПрофилей
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
	|		ПО (ГруппыДоступа.Профиль = ПраваПрофилей.Профиль)
	|			И (НЕ ГруппыДоступа.ПометкаУдаления)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК УчастникиГруппДоступа
	|		ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка)
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВидыОграниченийПрав КАК ВидыОграниченийПрав
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВидыИЗначенияДоступа КАК ВидыИЗначенияДоступа
	|			ПО (ВидыИЗначенияДоступа.ВидДоступа = ВидыОграниченийПрав.ВидДоступа)
	|				И (ВидыОграниченийПрав.ВидДоступа <> ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен))
	|				И (ВидыОграниченийПрав.ВидДоступа <> ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен))
	|		ПО (ВидыОграниченийПрав.Таблица = ПраваПрофилей.Таблица)
	|			И (ВидыИЗначенияДоступа.ГруппаДоступа = ГруппыДоступа.Ссылка)
	|			И (НЕ ВидыОграниченийПрав.ДляВнешнихПользователей
	|					И (ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.Пользователи)
	|						ИЛИ ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ГруппыПользователей))
	|				ИЛИ ВидыОграниченийПрав.ДляВнешнихПользователей
	|					И (ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ВнешниеПользователи)
	|						ИЛИ ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей)))
	|			И (ПраваПрофилей.ПравоПросмотр
	|					И НЕ ПраваПрофилей.ПравоЧтениеБезОграничения
	|					И ВидыОграниченийПрав.ПравоЧтение
	|				ИЛИ ПраваПрофилей.ПравоРедактирование
	|					И НЕ ПраваПрофилей.ПравоИзменениеБезОграничения
	|					И ВидыОграниченийПрав.ПравоИзменение
	|				ИЛИ ПраваПрофилей.ПравоИнтерактивноеДобавление
	|					И НЕ ПраваПрофилей.ПравоДобавлениеБезОграничения
	|					И ВидыОграниченийПрав.ПравоИзменение)
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВидыОграниченийПрав КАК ВидыОграниченийПравБезусловные
	|		ПО (ВидыОграниченийПравБезусловные.Таблица = ПраваПрофилей.Таблица)
	|			И (ВидыОграниченийПравБезусловные.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступРазрешен)
	|				ИЛИ ВидыОграниченийПравБезусловные.ВидДоступа = ЗНАЧЕНИЕ(Перечисление.ДополнительныеЗначенияДоступа.ДоступЗапрещен))
	|			И (НЕ ВидыОграниченийПравБезусловные.ДляВнешнихПользователей
	|					И (ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.Пользователи)
	|						ИЛИ ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ГруппыПользователей))
	|				ИЛИ ВидыОграниченийПравБезусловные.ДляВнешнихПользователей
	|					И (ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ВнешниеПользователи)
	|						ИЛИ ТИПЗНАЧЕНИЯ(УчастникиГруппДоступа.Пользователь) = ТИП(Справочник.ГруппыВнешнихПользователей)))
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПустыеСсылкиЗначенийДоступа КАК ПустыеСсылкиЗначенийДоступа
	|		ПО (ПустыеСсылкиЗначенийДоступа.ПустаяСсылка = ВидыИЗначенияДоступа.ЗначениеДоступа)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|		ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь)
	|			И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)
	|			И (&УсловиеОтбораПоПользователям)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
	|		ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)";
	
	ТекстЗапросаСГруппировкойПоОтчетамДополнение =
	"ВЫБРАТЬ
	|	ПраваРолейНаОтчеты.Отчет КАК Отчет,
	|	ПраваРолейНаОтчеты.Роль КАК Роль
	|ПОМЕСТИТЬ ПраваРолейНаОтчеты
	|ИЗ
	|	&ПраваРолейНаОтчеты КАК ПраваРолейНаОтчеты
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПрофилиГруппДоступаРоли.Ссылка КАК Профиль,
	|	ПраваРолейНаОтчеты.Отчет КАК Отчет
	|ПОМЕСТИТЬ ПраваПрофилейНаОтчеты
	|ИЗ
	|	ПраваРолейНаОтчеты КАК ПраваРолейНаОтчеты
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ПрофилиГруппДоступа.Роли КАК ПрофилиГруппДоступаРоли
	|		ПО ПраваРолейНаОтчеты.Роль = ПрофилиГруппДоступаРоли.Роль
	|			И (НЕ ПрофилиГруппДоступаРоли.Ссылка.ПометкаУдаления)
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Отчет
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицыОтчетов.Отчет КАК Отчет,
	|	ТаблицыОтчетов.ОбъектМетаданных КАК Таблица
	|ПОМЕСТИТЬ ТаблицыОтчетов
	|ИЗ
	|	&ТаблицыОтчетов КАК ТаблицыОтчетов
	|ГДЕ
	|	&ОтборОтчетовПоТаблицам
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	Таблица
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ТаблицыОтчетовСПравами.Отчет КАК Отчет,
	|	ТаблицыОтчетовСПравами.Таблица КАК Таблица,
	|	ТаблицыОтчетовСПравами.Профиль КАК Профиль,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоОтчета) КАК ПравоОтчета,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоЧтениеБезОграничения) КАК ПравоЧтениеБезОграничения,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоИзменениеБезОграничения) КАК ПравоИзменениеБезОграничения,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоДобавлениеБезОграничения) КАК ПравоДобавлениеБезОграничения,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоПросмотр) КАК ПравоПросмотр,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоРедактирование) КАК ПравоРедактирование,
	|	МАКСИМУМ(ТаблицыОтчетовСПравами.ПравоИнтерактивноеДобавление) КАК ПравоИнтерактивноеДобавление
	|ПОМЕСТИТЬ ПраваПрофилей
	|ИЗ
	|	(ВЫБРАТЬ
	|		ТаблицыОтчетов.Отчет КАК Отчет,
	|		ТаблицыОтчетов.Таблица КАК Таблица,
	|		ПраваПрофилейНаОтчеты.Профиль КАК Профиль,
	|		ИСТИНА КАК ПравоОтчета,
	|		ЛОЖЬ КАК ПравоЧтениеБезОграничения,
	|		ЛОЖЬ КАК ПравоИзменениеБезОграничения,
	|		ЛОЖЬ КАК ПравоДобавлениеБезОграничения,
	|		ЛОЖЬ КАК ПравоПросмотр,
	|		ЛОЖЬ КАК ПравоРедактирование,
	|		ЛОЖЬ КАК ПравоИнтерактивноеДобавление
	|	ИЗ
	|		ТаблицыОтчетов КАК ТаблицыОтчетов
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваПрофилейНаОтчеты КАК ПраваПрофилейНаОтчеты
	|			ПО (ПраваПрофилейНаОтчеты.Отчет = ТаблицыОтчетов.Отчет)
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ТаблицыОтчетов.Отчет,
	|		ТаблицыОтчетов.Таблица,
	|		ПраваПрофилейНаТаблицы.Профиль,
	|		ЛОЖЬ,
	|		ПраваПрофилейНаТаблицы.ПравоЧтениеБезОграничения,
	|		ПраваПрофилейНаТаблицы.ПравоИзменениеБезОграничения,
	|		ПраваПрофилейНаТаблицы.ПравоДобавлениеБезОграничения,
	|		ПраваПрофилейНаТаблицы.ПравоПросмотр,
	|		ПраваПрофилейНаТаблицы.ПравоРедактирование,
	|		ПраваПрофилейНаТаблицы.ПравоИнтерактивноеДобавление
	|	ИЗ
	|		ТаблицыОтчетов КАК ТаблицыОтчетов
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПраваПрофилейНаТаблицы КАК ПраваПрофилейНаТаблицы
	|			ПО (ПраваПрофилейНаТаблицы.Таблица = ТаблицыОтчетов.Таблица)
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ
	|		ТаблицыОтчетов.Отчет,
	|		ТаблицыОтчетов.Таблица,
	|		ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.ПустаяСсылка),
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ,
	|		ЛОЖЬ
	|	ИЗ
	|		ТаблицыОтчетов КАК ТаблицыОтчетов
	|	ГДЕ
	|		НЕ ИСТИНА В
	|					(ВЫБРАТЬ ПЕРВЫЕ 1
	|						ИСТИНА
	|					ИЗ
	|						ПраваПрофилейНаОтчеты КАК ПраваПрофилейНаОтчеты
	|					ГДЕ
	|						ПраваПрофилейНаОтчеты.Отчет = ТаблицыОтчетов.Отчет)
	|		И НЕ ИСТИНА В
	|					(ВЫБРАТЬ ПЕРВЫЕ 1
	|						ИСТИНА
	|					ИЗ
	|						ПраваПрофилейНаТаблицы КАК ПраваПрофилейНаТаблицы
	|					ГДЕ
	|						ПраваПрофилейНаТаблицы.Таблица = ТаблицыОтчетов.Таблица)) КАК ТаблицыОтчетовСПравами
	|
	|СГРУППИРОВАТЬ ПО
	|	ТаблицыОтчетовСПравами.Отчет,
	|	ТаблицыОтчетовСПравами.Таблица,
	|	ТаблицыОтчетовСПравами.Профиль";
	
	ТекстЗапросаСГруппировкойПоОтчетам =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПраваПрофилей.Отчет КАК Отчет,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоОтчета
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ПравоОтчета,
	|	ПраваПрофилей.Таблица КАК ОбъектМетаданных,
	|	ВЫБОР
	|		КОГДА &УпрощенныйИнтерфейсНастройкиПравДоступа
	|			ТОГДА ГруппыДоступа.Профиль
	|		ИНАЧЕ ГруппыДоступа.Ссылка
	|	КОНЕЦ КАК ГруппаДоступа,
	|	ПраваПрофилей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваПрофилей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваПрофилей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоИнтерактивноеДобавление
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоДобавлениеБезОграничения
	|						ТОГДА 3
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		КОГДА ПраваПрофилей.ПравоРедактирование
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоИзменениеБезОграничения
	|						ТОГДА 2
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		КОГДА ПраваПрофилей.ПравоПросмотр
	|			ТОГДА ВЫБОР
	|					КОГДА ПраваПрофилей.ПравоЧтениеБезОграничения
	|						ТОГДА 1
	|					ИНАЧЕ 0
	|				КОНЕЦ
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК ПравоБезОграничения,
	|	ПраваПрофилей.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваПрофилей.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваПрофилей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ВЫБОР
	|		КОГДА ПраваПрофилей.ПравоИнтерактивноеДобавление
	|			ТОГДА 3
	|		КОГДА ПраваПрофилей.ПравоРедактирование
	|			ТОГДА 2
	|		КОГДА ПраваПрофилей.ПравоПросмотр
	|			ТОГДА 1
	|		ИНАЧЕ 0
	|	КОНЕЦ КАК Право,
	|	СоставыГруппПользователей.Пользователь КАК Пользователь,
	|	ЕСТЬNULL(СведенияОПользователях.ВходВПрограммуРазрешен, ЛОЖЬ) КАК ВходВПрограммуРазрешен
	|ПОМЕСТИТЬ ПраваПользователей
	|ИЗ
	|	ПраваПрофилей КАК ПраваПрофилей
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа КАК ГруппыДоступа
	|		ПО (ГруппыДоступа.Профиль = ПраваПрофилей.Профиль)
	|			И (НЕ ГруппыДоступа.ПометкаУдаления)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ГруппыДоступа.Пользователи КАК УчастникиГруппДоступа
	|		ПО (УчастникиГруппДоступа.Ссылка = ГруппыДоступа.Ссылка)
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|		ПО (СоставыГруппПользователей.ГруппаПользователей = УчастникиГруппДоступа.Пользователь)
	|			И (СоставыГруппПользователей.Пользователь <> &ПользовательНеУказан)
	|			И (&УсловиеОтбораПоПользователям)
	|		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
	|		ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)";
	
	ТекстЗапросаСГруппировкойПоОтчетамКонечный =
	"ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	ПраваПользователей.Пользователь КАК Пользователь,
	|	ПраваПользователей.ВходВПрограммуРазрешен КАК ВходВПрограммуРазрешен
	|ПОМЕСТИТЬ ПользователиСПравами
	|ИЗ
	|	ПраваПользователей КАК ПраваПользователей
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПраваПользователей.Отчет КАК Отчет,
	|	ПраваПользователей.ПравоОтчета КАК ПравоОтчета,
	|	ПраваПользователей.ОбъектМетаданных КАК ОбъектМетаданных,
	|	ПраваПользователей.ГруппаДоступа КАК ГруппаДоступа,
	|	ПраваПользователей.ПравоЧтениеБезОграничения КАК ПравоЧтениеБезОграничения,
	|	ПраваПользователей.ПравоИзменениеБезОграничения КАК ПравоИзменениеБезОграничения,
	|	ПраваПользователей.ПравоДобавлениеБезОграничения КАК ПравоДобавлениеБезОграничения,
	|	ПраваПользователей.ПравоБезОграничения КАК ПравоБезОграничения,
	|	ПраваПользователей.ПравоПросмотр КАК ПравоПросмотр,
	|	ПраваПользователей.ПравоРедактирование КАК ПравоРедактирование,
	|	ПраваПользователей.ПравоИнтерактивноеДобавление КАК ПравоИнтерактивноеДобавление,
	|	ПраваПользователей.Право КАК Право,
	|	ПраваПользователей.Пользователь КАК Пользователь,
	|	ПраваПользователей.ВходВПрограммуРазрешен КАК ВходВПрограммуРазрешен
	|ИЗ
	|	ПраваПользователей КАК ПраваПользователей
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ТаблицыОтчетов.Отчет,
	|	0,
	|	ТаблицыОтчетов.Таблица,
	|	ВЫБОР
	|		КОГДА &УпрощенныйИнтерфейсНастройкиПравДоступа
	|			ТОГДА ЗНАЧЕНИЕ(Справочник.ПрофилиГруппДоступа.ПустаяСсылка)
	|		ИНАЧЕ ЗНАЧЕНИЕ(Справочник.ГруппыДоступа.ПустаяСсылка)
	|	КОНЕЦ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	ЛОЖЬ,
	|	0,
	|	ПользователиСПравами.Пользователь,
	|	ПользователиСПравами.ВходВПрограммуРазрешен
	|ИЗ
	|	ТаблицыОтчетов КАК ТаблицыОтчетов
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПользователиСПравами КАК ПользователиСПравами
	|		ПО (НЕ ИСТИНА В
	|					(ВЫБРАТЬ ПЕРВЫЕ 1
	|						ИСТИНА
	|					ИЗ
	|						ПраваПользователей КАК ПраваПользователей
	|					ГДЕ
	|						ПраваПользователей.Отчет = ТаблицыОтчетов.Отчет
	|						И ПраваПользователей.ОбъектМетаданных = ТаблицыОтчетов.Таблица
	|						И ПраваПользователей.Пользователь = ПользователиСПравами.Пользователь))";
	
	Запрос = Новый Запрос;
	
	УсловиеОтбораПоПользователям = "";
	УсловиеОтбораПоВходВПрограммуРазрешен = "";
	Если ОтборПоВходВПрограммуРазрешен() Тогда
		ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало =
			ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало + "
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях
			|		ПО (СведенияОПользователях.Пользователь = СоставыГруппПользователей.Пользователь)
			|			И (СведенияОПользователях.ВходВПрограммуРазрешен)";
		УсловиеОтбораПоВходВПрограммуРазрешен = "
		|			И (СведенияОПользователях.ВходВПрограммуРазрешен)";
	КонецЕсли;
	
	ОтборПоВидуПользователей = ОтборПоВидуПользователей();
	ОтборПоПользователям     = ОтборПоПользователям();
	Если ЗначениеЗаполнено(ОтборПоПользователям.Значение) И ОтборПоПользователям.БезГрупп Тогда
		Запрос.УстановитьПараметр("ВыбранныеПользователиБезГрупп", ОтборПоПользователям.Значение);
		УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + "
			|			И (СоставыГруппПользователей.Пользователь В (&ВыбранныеПользователиБезГрупп))";
		
	ИначеЕсли ЗначениеЗаполнено(ОтборПоПользователям.Значение) Тогда
		Запрос.УстановитьПараметр("ВыбранныеПользователиИГруппы", ОтборПоПользователям.Значение);
		УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + "
			|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК ОтборПользователей
			|		ПО (ОтборПользователей.Пользователь = СоставыГруппПользователей.Пользователь)
			|			И (ОтборПользователей.ГруппаПользователей В (&ВыбранныеПользователиИГруппы))";
		
	ИначеЕсли ОтборПоВидуПользователей = "Пользователи" Тогда
		УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + "
			|			И (ТИПЗНАЧЕНИЯ(СоставыГруппПользователей.Пользователь) = ТИП(Справочник.Пользователи))";
		
	ИначеЕсли ОтборПоВидуПользователей = "ВнешниеПользователи" Тогда
		УсловиеОтбораПоПользователям = УсловиеОтбораПоПользователям + "
			|			И (ТИПЗНАЧЕНИЯ(СоставыГруппПользователей.Пользователь) = ТИП(Справочник.ВнешниеПользователи))";
	КонецЕсли;
	УсловиеОтбораПоПользователям = Сред(УсловиеОтбораПоПользователям, 4);
	
	ВключенаГруппировкаПоОтчетам = ВключенаГруппировкаПоОтчетам();
	ВариантСОграничениямиДоступа = ВариантСОграничениямиДоступа();
	
	Если ВключенаГруппировкаПоОтчетам Тогда
		ТекстЗапросаОсновной = ТекстЗапросаСГруппировкойПоОтчетам;
		Запрос.Текст = ТекстЗапросаОбщий + ОбщегоНазначения.РазделительПакетаЗапросов()
			+ ТекстЗапросаСГруппировкойПоОтчетамДополнение;
		Запрос.УстановитьПараметр("ПраваРолейНаОтчеты", ПраваРолейНаОтчеты());
		Запрос.УстановитьПараметр("ТаблицыОтчетов",     ТаблицыОтчетов());
		
	ИначеЕсли ВариантСОграничениямиДоступа Тогда
		УниверсальноеОграничение =
			УправлениеДоступомСлужебный.ОграничиватьДоступНаУровнеЗаписейУниверсально(Истина, Истина);
		Если УниверсальноеОграничение Тогда
			ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграничений
				= ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграниченийПоНовому;
			Запрос.УстановитьПараметр("ВидыОграниченийПрав",
				Отчеты.АнализПравДоступа.ВидыОграниченийПрав(, Истина));
		Иначе
			ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграничений
				= ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграниченийПоСтарому;
			Запрос.УстановитьПараметр("ВидыОграниченийПрав",
				Отчеты.АнализПравДоступа.ВидыОграниченийПрав());
		КонецЕсли;
		ТекстЗапросаОсновной = ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаНачало
			+ ОбщегоНазначения.РазделительПакетаЗапросов()
			+ ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаВидыОграничений
			+ ОбщегоНазначения.РазделительПакетаЗапросов()
			+ ТекстЗапросаБезГруппировкиПоОтчетамСОграничениямиДоступаКонец;
		Запрос.Текст = ТекстЗапросаОбщий;
		Запрос.УстановитьПараметр("ТекстРазрешенные", " (" + НСтр("ru = 'Разрешенные'")+ ")");
		Запрос.УстановитьПараметр("ТекстЗапрещенные", " (" + НСтр("ru = 'Запрещенные'") + ")");
		Запрос.УстановитьПараметр("ТекстРазрешенныеПользователи", " (" + НСтр("ru = 'Разрешенные'") + ") - "
			+ НСтр("ru = 'авторизованный пользователь всегда разрешен'"));
		Запрос.УстановитьПараметр("ТекстЗапрещенныеПользователи", " (" + НСтр("ru = 'Запрещенные'") + ") - "
			+ НСтр("ru = 'авторизованный пользователь всегда разрешен'"));
		Запрос.УстановитьПараметр("ТекстОграничениеБезВидовДоступа", "<" + НСтр("ru = 'Ограничение без видов доступа'")+ ">");
		Запрос.УстановитьПараметр("ТекстБезОграничения", "<" + НСтр("ru = 'Без ограничения'") + ">");
		Запрос.УстановитьПараметр("ТекстВсеРазрешены", "<" + НСтр("ru = 'Все разрешены'") + ">");
		Запрос.УстановитьПараметр("ТекстВсеЗапрещены", "<" + НСтр("ru = 'Все запрещены'") + ">");
		Запрос.УстановитьПараметр("ПустыеСсылкиЗначенийДоступа",
			УправлениеДоступомСлужебный.ПустыеСсылкиЗначенийДоступа());
	Иначе
		ТекстЗапросаОсновной = ТекстЗапросаБезГруппировкиПоОтчетам;
		Запрос.Текст = ТекстЗапросаОбщий;
	КонецЕсли;
	
	УпрощенныйИнтерфейс = УправлениеДоступомСлужебный.УпрощенныйИнтерфейсНастройкиПравДоступа();
	Если Не УпрощенныйИнтерфейс Тогда
		ТекстЗапросаОсновной = СтрЗаменить(ТекстЗапросаОсновной,
			"ВЫБРАТЬ РАЗЛИЧНЫЕ", "ВЫБРАТЬ"); // @query-part-1 @query-part-2
	КонецЕсли;
	Запрос.Текст = Запрос.Текст + ОбщегоНазначения.РазделительПакетаЗапросов()
		+ ТекстЗапросаОсновной;
	
	Запрос.УстановитьПараметр("УпрощенныйИнтерфейсНастройкиПравДоступа", УпрощенныйИнтерфейс);
	Запрос.УстановитьПараметр("ПраваРолейРасширений", УправлениеДоступомСлужебный.ПраваРолейРасширений());
	Запрос.УстановитьПараметр("ПользовательНеУказан", Пользователи.СсылкаНеуказанногоПользователя());
	
	ОтборПоТаблицам = ОтборПоТаблицам();
	Если ЗначениеЗаполнено(ОтборПоТаблицам) Тогда
		Запрос.УстановитьПараметр("ВыбранныеТаблицы", ОтборПоТаблицам);
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПравПоТаблицам",
			"ПраваРолей.ОбъектМетаданных В (&ВыбранныеТаблицы)");
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборОтчетовПоТаблицам",
			"ТаблицыОтчетов.ОбъектМетаданных В (&ВыбранныеТаблицы)");
	Иначе
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборПравПоТаблицам", "ИСТИНА");
		Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ОтборОтчетовПоТаблицам", "ИСТИНА");
	КонецЕсли;
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст,
		"И (&УсловиеОтбораПоПользователям)", УсловиеОтбораПоПользователям);
	
	Если ЗначениеЗаполнено(УсловиеОтбораПоВходВПрограммуРазрешен) Тогда
		Запрос.Текст = Запрос.Текст + УсловиеОтбораПоВходВПрограммуРазрешен;
		Запрос.Текст = СтрЗаменить(Запрос.Текст,
			"ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях",
			"ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОПользователях КАК СведенияОПользователях");
	КонецЕсли;
	
	Если ВключенаГруппировкаПоОтчетам Тогда
		Запрос.Текст = Запрос.Текст + "
		|
		|ИНДЕКСИРОВАТЬ ПО
		|	Отчет,
		|	ОбъектМетаданных,
		|	Пользователь";
		Запрос.Текст = Запрос.Текст + ОбщегоНазначения.РазделительПакетаЗапросов()
			+ ТекстЗапросаСГруппировкойПоОтчетамКонечный;
	КонецЕсли;
	
	Результат = Запрос.Выполнить().Выгрузить();
	
	Возврат Результат;
	
КонецФункции

Функция ВключенаГруппировкаПоОтчетам()
	
	СписокПолей = Новый Массив;
	ЗаполнитьСписокПолейГруппировок(КомпоновщикНастроек.ПолучитьНастройки().Структура, СписокПолей);
	
	Возврат СписокПолей.Найти(Новый ПолеКомпоновкиДанных("Отчет")) <> Неопределено;
	
КонецФункции

Функция ВариантСОграничениямиДоступа()
	
	Вариант = КомпоновщикНастроек.Настройки.ДополнительныеСвойства.КлючПредопределенногоВарианта;
	
	Возврат Вариант = "ПраваПользователяНаТаблицу";
	
КонецФункции

// Возвращаемое значение:
//  Структура:
//    * ЕстьИерархия - Булево
//    * ОписаниеПрав - ФиксированныйМассив из см. РегистрыСведений.НастройкиПравОбъектов.СвойстваВозможногоПрава
//    * ТипСсылки    - Тип
//    * ПустаяСсылка - ЛюбаяСсылка
//
Функция НастройкиПравПоТаблицеВОтборе()
	
	Таблица = ОтборПоТаблицам();
	Если Не ЗначениеЗаполнено(Таблица)
	 Или Не ОписаниеТиповИдентификатора().СодержитТип(ТипЗнч(Таблица)) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	МетаданныеТаблицы = ОбщегоНазначения.ОбъектМетаданныхПоИдентификатору(Таблица, Ложь);
	Если МетаданныеТаблицы = Неопределено
	 Или Не ОбщегоНазначения.ЭтоОбъектСсылочногоТипа(МетаданныеТаблицы) Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(МетаданныеТаблицы.ПолноеИмя());
	ПустаяСсылка = МенеджерОбъекта.ПустаяСсылка();
	ТипСсылки = ТипЗнч(ПустаяСсылка);
	ВозможныеПрава = УправлениеДоступомСлужебный.ВозможныеПраваДляНастройкиПравОбъектов();
	
	ОписаниеПрав = ВозможныеПрава.ПоТипамСсылок.Получить(ТипСсылки);
	Если ОписаниеПрав = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	Свойства = Новый Структура("Иерархический", Ложь);
	ЗаполнитьЗначенияСвойств(Свойства, МетаданныеТаблицы);
	
	Результат = Новый Структура;
	Результат.Вставить("ЕстьИерархия", Свойства.Иерархический);
	Результат.Вставить("ОписаниеПрав", ОписаниеПрав);
	Результат.Вставить("ТипСсылки",    ТипСсылки);
	Результат.Вставить("ПустаяСсылка", ПустаяСсылка);
	
	Возврат Результат;
	
КонецФункции

// Параметры:
//  КоллекцияЭлементов - КоллекцияЭлементовСтруктурыНастроекКомпоновкиДанных
//  СписокПолей - Массив
//
Процедура ЗаполнитьСписокПолейГруппировок(КоллекцияЭлементов, СписокПолей)
	
	Для Каждого Элемент Из КоллекцияЭлементов Цикл
		Если (ТипЗнч(Элемент) = Тип("ГруппировкаКомпоновкиДанных")
			Или ТипЗнч(Элемент) = Тип("ГруппировкаТаблицыКомпоновкиДанных"))
			И Элемент.Использование Тогда
			Для Каждого Поле Из Элемент.ПоляГруппировки.Элементы Цикл
				Если ТипЗнч(Поле) = Тип("ПолеГруппировкиКомпоновкиДанных") Тогда
					Если Поле.Использование Тогда
						СписокПолей.Добавить(Поле.Поле);
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
			ЗаполнитьСписокПолейГруппировок(Элемент.Структура, СписокПолей);
		ИначеЕсли ТипЗнч(Элемент) = Тип("ТаблицаКомпоновкиДанных") И Элемент.Использование Тогда
			ЗаполнитьСписокПолейГруппировок(Элемент.Строки, СписокПолей);
			ЗаполнитьСписокПолейГруппировок(Элемент.Колонки, СписокПолей);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Функция ВыбранныйОтчет()
	
	ВыбранныеОтчеты = Новый Массив;
	Отбор = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
	Для Каждого Элемент Из Отбор.Элементы Цикл 
		Если Элемент.Использование И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Отчет") Тогда
			Если Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно Тогда
				ВыбранныеОтчеты.Добавить(Элемент.ПравоеЗначение);
			Иначе
				Возврат Неопределено;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Если ВыбранныеОтчеты.Количество() = 1 Тогда
		Возврат ВыбранныеОтчеты[0];
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

Функция ОтборПоВидуПользователей()
	
	Если Не Константы.ИспользоватьВнешнихПользователей.Получить() Тогда
		Возврат "Пользователи";
	КонецЕсли;
	
	ПолеОтбора = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("ВидПользователей");
	Если Не ПолеОтбора.Использование Тогда
		Возврат "";
	КонецЕсли;
	
	Если ПолеОтбора.Значение = 0 Тогда
		Возврат "Пользователи";
	КонецЕсли;
	
	Если ПолеОтбора.Значение = 1 Тогда
		Возврат "ВнешниеПользователи";
	КонецЕсли;
	
	Возврат "";
	
КонецФункции

Функция ОтборПоПользователям()
	
	Результат = Новый Структура;
	Результат.Вставить("БезГрупп", Истина);
	Результат.Вставить("Значение", Неопределено);
	
	ПолеОтбора = КомпоновщикНастроек.ПолучитьНастройки().ПараметрыДанных.Элементы.Найти("Пользователь");
	ЗначениеОтбора = ПолеОтбора.Значение;
	Если Не ПолеОтбора.Использование Или Не ЗначениеЗаполнено(ЗначениеОтбора) Тогда
		Возврат Результат;
	КонецЕсли;
	Результат.Значение = ЗначениеОтбора;
	
	Если ТипЗнч(ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
		ЗначениеОтбора = Новый СписокЗначений;
		ЗначениеОтбора.Добавить(Результат.Значение);
	КонецЕсли;
	
	Для Каждого ЭлементСписка Из ЗначениеОтбора Цикл
		Если ТипЗнч(ЭлементСписка.Значение) = Тип("СправочникСсылка.ГруппыПользователей")
		 Или ТипЗнч(ЭлементСписка.Значение) = Тип("СправочникСсылка.ГруппыВнешнихПользователей") Тогда
			Результат.БезГрупп = Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Функция ОтборПоТаблицам()
	
	Отбор = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
	Для Каждого Элемент Из Отбор.Элементы Цикл 
		Если Элемент.Использование И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ОбъектМетаданных") Тогда
			Если Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно
			 Или Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке Тогда
				Возврат Элемент.ПравоеЗначение;
			Иначе
				Возврат Неопределено;
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

Функция ОтборПоВходВПрограммуРазрешен()
	
	Отбор = КомпоновщикНастроек.ПолучитьНастройки().Отбор;
	
	Для Каждого Элемент Из Отбор.Элементы Цикл 
		Если Элемент.Использование
		   И Элемент.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВходВПрограммуРазрешен")
		   И Элемент.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно
		   И Элемент.ПравоеЗначение = Истина Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции

Функция НастройкиПравПоОбъектам()
	
	Результат = Новый Структура;
	Результат.Вставить("НастройкиПравПоОбъектам", Новый ТаблицаЗначений);
	Результат.Вставить("НастройкиПравИерархия",   Новый ТаблицаЗначений);
	Результат.Вставить("НастройкиПравЛегенда",    Новый ТаблицаЗначений);
	Результат.Вставить("ВладелецНастроекЗаголовок", "");
	
	Если Не ВариантСОграничениямиДоступа() Тогда
		Возврат Результат;
	КонецЕсли;
	
	НастройкиПрав = НастройкиПравПоТаблицеВОтборе();
	Если НастройкиПрав = Неопределено Тогда
		Возврат Результат;
	КонецЕсли;
	Результат.ВладелецНастроекЗаголовок = Строка(НастройкиПрав.ТипСсылки);
	
	ОписаниеПользователя = ОтборПоПользователям().Значение;
	Если ТипЗнч(ОписаниеПользователя) = Тип("СписокЗначений") Тогда
		Если ОписаниеПользователя.Количество() <> 1 Тогда
			Возврат Результат;
		КонецЕсли;
		Пользователь = ОписаниеПользователя[0].Значение;
	Иначе
		Пользователь = ОписаниеПользователя;
	КонецЕсли;
	Если ТипЗнч(Пользователь) <> Тип("СправочникСсылка.Пользователи")
	   И ТипЗнч(Пользователь) <> Тип("СправочникСсылка.ВнешниеПользователи") Тогда
		Возврат Результат;
	КонецЕсли;
	
	Если Пользователи.ЭтоПолноправныйПользователь(Пользователь) Тогда
		Возврат Результат;
	КонецЕсли;
	
	ИмяДляПодпапок = ОписаниеКолонкиДляПодпапок().Имя;
	ЗаголовкиПрав = ЗаголовкиПрав(НастройкиПрав, ИмяДляПодпапок);
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ТипОбъектов",    НастройкиПрав.ТипСсылки);
	Запрос.УстановитьПараметр("Пользователь",   Пользователь);
	Запрос.УстановитьПараметр("ИмяДляПодпапок", ИмяДляПодпапок);
	Запрос.УстановитьПараметр("ЕстьИерархия",   НастройкиПрав.ЕстьИерархия);
	Запрос.УстановитьПараметр("ПустойРодитель", НастройкиПрав.ПустаяСсылка);
	Запрос.УстановитьПараметр("ЗаголовкиПрав",  ЗаголовкиПрав);
	Запрос.УстановитьПараметр("ПредставлениеПерсонально",  НСтр("ru = 'Персонально'"));
	Запрос.УстановитьПараметр("ПредставлениеНеопределено", НСтр("ru = 'Неопределено'"));
	Запрос.УстановитьПараметр("ПредставлениеГруппыПользователей",
		" (" + НСтр("ru = 'Группа пользователей'") + ")");
	Запрос.УстановитьПараметр("ПредставлениеГруппыВнешнихПользователей",
		" (" + НСтр("ru = 'Группа внешних пользователей'") + ")");
	
	Запрос.Текст =
	"ВЫБРАТЬ
	|	НастройкиПрав.Объект КАК ВладелецНастроек,
	|	НастройкиПрав.Пользователь КАК ПользовательНастройки,
	|	НастройкиПрав.Право КАК НастроенноеПраво,
	|	ВЫБОР
	|		КОГДА НастройкиПрав.ПравоЗапрещено
	|			ТОГДА 2
	|		ИНАЧЕ 1
	|	КОНЕЦ КАК ЗначениеПрава
	|ПОМЕСТИТЬ НастройкиПравПоВладельцам
	|ИЗ
	|	РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
	|ГДЕ
	|	ИСТИНА В
	|			(ВЫБРАТЬ ПЕРВЫЕ 1
	|				ИСТИНА
	|			ИЗ
	|				РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ГДЕ
	|				СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
	|				И СоставыГруппПользователей.Пользователь = &Пользователь)
	|	И ТИПЗНАЧЕНИЯ(НастройкиПрав.Объект) = &ТипОбъектов
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь,
	|	&ИмяДляПодпапок,
	|	ВЫБОР
	|		КОГДА МАКСИМУМ(НастройкиПрав.НаследованиеРазрешено) = ЛОЖЬ
	|			ТОГДА 2
	|		ИНАЧЕ 1
	|	КОНЕЦ
	|ИЗ
	|	РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
	|ГДЕ
	|	&ЕстьИерархия
	|	И ИСТИНА В
	|			(ВЫБРАТЬ ПЕРВЫЕ 1
	|				ИСТИНА
	|			ИЗ
	|				РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ГДЕ
	|				СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь
	|				И СоставыГруппПользователей.Пользователь = &Пользователь)
	|	И ТИПЗНАЧЕНИЯ(НастройкиПрав.Объект) = &ТипОбъектов
	|
	|СГРУППИРОВАТЬ ПО
	|	НастройкиПрав.Объект,
	|	НастройкиПрав.Пользователь
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	РассчитанныеПрава.ВладелецНастроек КАК ВладелецНастроек,
	|	РассчитанныеПрава.НастроенноеПраво КАК НастроенноеПраво,
	|	МАКСИМУМ(РассчитанныеПрава.ЗначениеПрава) КАК ЗначениеПрава
	|ПОМЕСТИТЬ РассчитанныеПраваПоВладельцам
	|ИЗ
	|	(ВЫБРАТЬ РАЗЛИЧНЫЕ
	|		НаследованиеНастроек.Объект КАК ВладелецНастроек,
	|		НастройкиПрав.Право КАК НастроенноеПраво,
	|		1 КАК ЗначениеПрава
	|	ИЗ
	|		РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
	|			ПО (ТИПЗНАЧЕНИЯ(НаследованиеНастроек.Объект) = &ТипОбъектов)
	|				И (НастройкиПрав.Объект = НаследованиеНастроек.Родитель)
	|				И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньРазрешенияПрава
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ПО (СоставыГруппПользователей.Пользователь = &Пользователь)
	|				И (СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь)
	|	
	|	ОБЪЕДИНИТЬ ВСЕ
	|	
	|	ВЫБРАТЬ РАЗЛИЧНЫЕ
	|		НаследованиеНастроек.Объект,
	|		НастройкиПрав.Право,
	|		2
	|	ИЗ
	|		РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравОбъектов КАК НастройкиПрав
	|			ПО (ТИПЗНАЧЕНИЯ(НаследованиеНастроек.Объект) = &ТипОбъектов)
	|				И (НастройкиПрав.Объект = НаследованиеНастроек.Родитель)
	|				И НаследованиеНастроек.УровеньИспользования < НастройкиПрав.УровеньЗапрещенияПрава
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
	|			ПО (СоставыГруппПользователей.Пользователь = &Пользователь)
	|				И (СоставыГруппПользователей.ГруппаПользователей = НастройкиПрав.Пользователь)) КАК РассчитанныеПрава
	|
	|СГРУППИРОВАТЬ ПО
	|	РассчитанныеПрава.ВладелецНастроек,
	|	РассчитанныеПрава.НастроенноеПраво
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	НаследованиеНастроек.Объект КАК ВладелецНастроек,
	|	НаследованиеНастроек.Наследовать КАК НаследованиеНастроек
	|ПОМЕСТИТЬ НаследованиеНастроекПоВладельцам
	|ИЗ
	|	РегистрСведений.НаследованиеНастроекПравОбъектов КАК НаследованиеНастроек
	|ГДЕ
	|	НаследованиеНастроек.Объект = НаследованиеНастроек.Родитель
	|	И ТИПЗНАЧЕНИЯ(НаследованиеНастроек.Объект) = &ТипОбъектов
	|	И ИСТИНА В
	|			(ВЫБРАТЬ ПЕРВЫЕ 1
	|				ИСТИНА
	|			ИЗ
	|				РассчитанныеПраваПоВладельцам КАК РассчитанныеПраваПоВладельцам
	|					ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НаследованиеНастроекПравОбъектов КАК Родители
	|					ПО
	|						Родители.Объект = РассчитанныеПраваПоВладельцам.ВладелецНастроек
	|							И Родители.Родитель = НаследованиеНастроек.Объект)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЗаголовкиПрав.ИмяПрава КАК ИмяПрава,
	|	ЗаголовкиПрав.ЗаголовокПрава КАК ЗаголовокПрава,
	|	ЗаголовкиПрав.ИндексПрава КАК ИндексПрава
	|ПОМЕСТИТЬ ЗаголовкиПрав
	|ИЗ
	|	&ЗаголовкиПрав КАК ЗаголовкиПрав
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ ПЕРВЫЕ 1
	|	РассчитанныеПраваПоВладельцам.ВладелецНастроек КАК ВладелецНастроек,
	|	ЕСТЬNULL(НаследованиеНастроекПоВладельцам.НаследованиеНастроек, ЛОЖЬ) КАК НаследованиеНастроек
	|ПОМЕСТИТЬ ОдинВладелецНастроек
	|ИЗ
	|	РассчитанныеПраваПоВладельцам КАК РассчитанныеПраваПоВладельцам
	|		ЛЕВОЕ СОЕДИНЕНИЕ НаследованиеНастроекПоВладельцам КАК НаследованиеНастроекПоВладельцам
	|		ПО (НаследованиеНастроекПоВладельцам.ВладелецНастроек = РассчитанныеПраваПоВладельцам.ВладелецНастроек)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА НаследованиеНастроекПоВладельцам.ВладелецНастроек.Родитель <> &ПустойРодитель
	|			ТОГДА НаследованиеНастроекПоВладельцам.ВладелецНастроек.Родитель
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК РодительВладельцаИлиПользователяНастроек,
	|	НаследованиеНастроекПоВладельцам.ВладелецНастроек КАК ВладелецИлиПользовательНастроек,
	|	ПРЕДСТАВЛЕНИЕ(НаследованиеНастроекПоВладельцам.ВладелецНастроек) КАК ВладелецИлиПользовательНастроекПредставление,
	|	ВЫБОР
	|		КОГДА НаследованиеНастроекПоВладельцам.ВладелецНастроек.Родитель <> &ПустойРодитель
	|			ТОГДА НаследованиеНастроекПоВладельцам.ВладелецНастроек.Родитель
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ВладелецНастроек,
	|	ИСТИНА КАК ЭтоВладелецНастроек
	|ИЗ
	|	НаследованиеНастроекПоВладельцам КАК НаследованиеНастроекПоВладельцам
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ РАЗЛИЧНЫЕ
	|	НастройкиПравПоВладельцам.ВладелецНастроек,
	|	НастройкиПравПоВладельцам.ПользовательНастройки,
	|	ВЫБОР
	|		КОГДА ТИПЗНАЧЕНИЯ(НастройкиПравПоВладельцам.ПользовательНастройки) = ТИП(Справочник.Пользователи)
	|				ИЛИ ТИПЗНАЧЕНИЯ(НастройкиПравПоВладельцам.ПользовательНастройки) = ТИП(Справочник.ВнешниеПользователи)
	|			ТОГДА &ПредставлениеПерсонально
	|		КОГДА ТИПЗНАЧЕНИЯ(НастройкиПравПоВладельцам.ПользовательНастройки) = ТИП(Справочник.ГруппыПользователей)
	|			ТОГДА ВЫРАЗИТЬ(НастройкиПравПоВладельцам.ПользовательНастройки КАК Справочник.ГруппыПользователей).Наименование + &ПредставлениеГруппыПользователей
	|		КОГДА ТИПЗНАЧЕНИЯ(НастройкиПравПоВладельцам.ПользовательНастройки) = ТИП(Справочник.ГруппыВнешнихПользователей)
	|			ТОГДА ВЫРАЗИТЬ(НастройкиПравПоВладельцам.ПользовательНастройки КАК Справочник.ГруппыВнешнихПользователей).Наименование + &ПредставлениеГруппыВнешнихПользователей
	|		ИНАЧЕ &ПредставлениеНеопределено
	|	КОНЕЦ,
	|	НастройкиПравПоВладельцам.ВладелецНастроек,
	|	ЛОЖЬ
	|ИЗ
	|	НастройкиПравПоВладельцам КАК НастройкиПравПоВладельцам
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА РассчитанныеПраваПоВладельцам.ВладелецНастроек.Родитель <> &ПустойРодитель
	|			ТОГДА РассчитанныеПраваПоВладельцам.ВладелецНастроек.Родитель
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ КАК ВладелецНастроек,
	|	РассчитанныеПраваПоВладельцам.ВладелецНастроек КАК ВладелецИлиПользовательНастроек,
	|	ИСТИНА КАК ЭтоВладелецНастроек,
	|	ЕСТЬNULL(НаследованиеНастроекПоВладельцам.НаследованиеНастроек, ЛОЖЬ) КАК НаследованиеНастроекВладельцем,
	|	ЕСТЬNULL(ЗаголовкиПрав.ЗаголовокПрава, РассчитанныеПраваПоВладельцам.НастроенноеПраво) КАК НастроенноеПраво,
	|	ЕСТЬNULL(ЗаголовкиПрав.ИндексПрава, 99) КАК ИндексПрава,
	|	РассчитанныеПраваПоВладельцам.ЗначениеПрава КАК ЗначениеПрава
	|ИЗ
	|	РассчитанныеПраваПоВладельцам КАК РассчитанныеПраваПоВладельцам
	|		ЛЕВОЕ СОЕДИНЕНИЕ ЗаголовкиПрав КАК ЗаголовкиПрав
	|		ПО (ЗаголовкиПрав.ИмяПрава = РассчитанныеПраваПоВладельцам.НастроенноеПраво)
	|		ЛЕВОЕ СОЕДИНЕНИЕ НаследованиеНастроекПоВладельцам КАК НаследованиеНастроекПоВладельцам
	|		ПО (НаследованиеНастроекПоВладельцам.ВладелецНастроек = РассчитанныеПраваПоВладельцам.ВладелецНастроек)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	НастройкиПравПоВладельцам.ВладелецНастроек,
	|	НастройкиПравПоВладельцам.ПользовательНастройки,
	|	ЛОЖЬ,
	|	ЕСТЬNULL(НаследованиеНастроекПоВладельцам.НаследованиеНастроек, ЛОЖЬ),
	|	ЕСТЬNULL(ЗаголовкиПрав.ЗаголовокПрава, НастройкиПравПоВладельцам.НастроенноеПраво),
	|	ЕСТЬNULL(ЗаголовкиПрав.ИндексПрава, 99),
	|	НастройкиПравПоВладельцам.ЗначениеПрава
	|ИЗ
	|	НастройкиПравПоВладельцам КАК НастройкиПравПоВладельцам
	|		ЛЕВОЕ СОЕДИНЕНИЕ ЗаголовкиПрав КАК ЗаголовкиПрав
	|		ПО (ЗаголовкиПрав.ИмяПрава = НастройкиПравПоВладельцам.НастроенноеПраво)
	|		ЛЕВОЕ СОЕДИНЕНИЕ НаследованиеНастроекПоВладельцам КАК НаследованиеНастроекПоВладельцам
	|		ПО (НаследованиеНастроекПоВладельцам.ВладелецНастроек = НастройкиПравПоВладельцам.ВладелецНастроек)
	|
	|ОБЪЕДИНИТЬ ВСЕ
	|
	|ВЫБРАТЬ
	|	ВЫБОР
	|		КОГДА ОдинВладелецНастроек.ВладелецНастроек.Родитель <> &ПустойРодитель
	|			ТОГДА ОдинВладелецНастроек.ВладелецНастроек.Родитель
	|		ИНАЧЕ НЕОПРЕДЕЛЕНО
	|	КОНЕЦ,
	|	ОдинВладелецНастроек.ВладелецНастроек,
	|	ИСТИНА,
	|	ОдинВладелецНастроек.НаследованиеНастроек,
	|	ЗаголовкиПрав.ЗаголовокПрава,
	|	ЗаголовкиПрав.ИндексПрава,
	|	0
	|ИЗ
	|	ЗаголовкиПрав КАК ЗаголовкиПрав
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОдинВладелецНастроек КАК ОдинВладелецНастроек
	|		ПО (НЕ ИСТИНА В
	|					(ВЫБРАТЬ ПЕРВЫЕ 1
	|						ИСТИНА
	|					ИЗ
	|						РассчитанныеПраваПоВладельцам КАК РассчитанныеПрава
	|					ГДЕ
	|						РассчитанныеПрава.НастроенноеПраво = ЗаголовкиПрав.ИмяПрава))";
	
	РезультатыЗапроса = Запрос.ВыполнитьПакет();
	
	Результат.НастройкиПравИерархия   = РезультатыЗапроса[РезультатыЗапроса.ВГраница()-1].Выгрузить();
	Результат.НастройкиПравПоОбъектам = РезультатыЗапроса[РезультатыЗапроса.ВГраница()].Выгрузить();
	Результат.НастройкиПравЛегенда    = НастройкиПравЛегенда(ЗаголовкиПрав, НастройкиПрав.ЕстьИерархия);
	
	Возврат Результат;
	
КонецФункции

Функция ЗаголовкиПрав(НастройкиПрав, ИмяДляПодпапок)
	
	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить("ИмяПрава",       Новый ОписаниеТипов("Строка",
		,,, Новый КвалификаторыСтроки(60, ДопустимаяДлина.Переменная)));
	Результат.Колонки.Добавить("ИндексПрава",    Новый ОписаниеТипов("Число",
		,, Новый КвалификаторыЧисла(2, 0, ДопустимыйЗнак.Неотрицательный)));
	Результат.Колонки.Добавить("ЗаголовокПрава", Новый ОписаниеТипов("Строка",
		,,, Новый КвалификаторыСтроки(60, ДопустимаяДлина.Переменная)));
	Результат.Колонки.Добавить("ПодсказкаПрава", Новый ОписаниеТипов("Строка",
		,,, Новый КвалификаторыСтроки(150, ДопустимаяДлина.Переменная)));
	
	Для Каждого ОписаниеПрава Из НастройкиПрав.ОписаниеПрав Цикл
		ПредставленияПрава = РегистрыСведений.НастройкиПравОбъектов.ПредставлениеВозможногоПрава(ОписаниеПрава);
		НоваяСтрока = Результат.Добавить();
		НоваяСтрока.ИмяПрава       = ОписаниеПрава.Имя;
		НоваяСтрока.ИндексПрава    = ОписаниеПрава.ИндексПрава;
		НоваяСтрока.ЗаголовокПрава = СтрЗаменить(ПредставленияПрава.Заголовок, Символы.ПС, " ");
		НоваяСтрока.ПодсказкаПрава = СтрЗаменить(ПредставленияПрава.Подсказка, Символы.ПС, " ");
	КонецЦикла;
	
	Если НастройкиПрав.ЕстьИерархия Тогда
		ОписаниеКолонки = ОписаниеКолонкиДляПодпапок();
		НоваяСтрока = Результат.Добавить();
		НоваяСтрока.ИмяПрава       = ОписаниеКолонки.Имя;
		НоваяСтрока.ИндексПрава    = НастройкиПрав.ОписаниеПрав.Количество();
		НоваяСтрока.ЗаголовокПрава = ОписаниеКолонки.Заголовок;
		НоваяСтрока.ПодсказкаПрава = ОписаниеКолонки.Подсказка;
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

Функция ОписаниеКолонкиДляПодпапок()
	
	Результат = Новый Структура;
	Результат.Вставить("Имя", "ДляПодпапок");
	Результат.Вставить("Заголовок", НСтр("ru = 'Для подпапок'"));
	Результат.Вставить("Подсказка",
		НСтр("ru = 'Права не только для текущей папки, но и для ее нижестоящих папок'"));
	
	Возврат Результат;
	
КонецФункции

Функция НастройкиПравЛегенда(ЗаголовкиПрав, ЕстьИерархия)
	
	Результат = ЗаголовкиПрав.Скопировать(, "ЗаголовокПрава,ПодсказкаПрава");
	
	Если ЕстьИерархия Тогда
		НоваяСтрока = Результат.Вставить(0);
		НоваяСтрока.ЗаголовокПрава = "";
		НоваяСтрока.ПодсказкаПрава = НСтр("ru = 'Наследование прав от вышестоящих папок'");
	КонецЕсли;
	
	Для Каждого Строка Из Результат Цикл
		Строка.ПодсказкаПрава = "- " + Строка.ПодсказкаПрава;
	КонецЦикла;
	
	Возврат Результат;
	
КонецФункции

Процедура УстановитьОтбор(ИмяПараметра, Значение, НастройкиКомпоновки, ПользовательскиеНастройки)
	
	ЭлементНастройки = ПользовательскаяНастройкаПараметра(ПользовательскиеНастройки,
		Новый ПараметрКомпоновкиДанных(ИмяПараметра));
	
	Если ЭлементНастройки <> Неопределено Тогда
		ЭлементНастройки.Использование = Истина;
		ЭлементНастройки.Значение = Значение;
		Возврат;
	КонецЕсли;
	
	Параметр = НастройкиКомпоновки.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	Если Параметр = Неопределено Тогда
		НастройкиКД = КомпоновщикНастроек.Настройки;
		Параметр = НастройкиКД.ПараметрыДанных.Элементы.Найти(ИмяПараметра);
	КонецЕсли;
	Параметр.Использование = Истина;
	Параметр.Значение = Значение;
	
КонецПроцедуры

Функция ПользовательскаяНастройкаПараметра(ПользовательскиеНастройки, Параметр)
	
	Для Каждого ЭлементНастройки Из ПользовательскиеНастройки.Элементы Цикл
		Свойства = Новый Структура("Параметр");
		ЗаполнитьЗначенияСвойств(Свойства, ЭлементНастройки);
		Если Свойства.Параметр = Параметр Тогда
			Возврат ЭлементНастройки;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

Процедура ОтключитьГруппировки(НастройкиКомпоновщика, ИменаГруппировок)
	
	Имена = СтрРазделить(ИменаГруппировок, ",", Ложь);
	Для Каждого Группировка Из НастройкиКомпоновщика.Структура Цикл
		Если Имена.Найти(Группировка.Имя) = Неопределено Тогда
			Продолжить;
		КонецЕсли;
		Группировка.Использование = Ложь;
	КонецЦикла;
	
КонецПроцедуры

#КонецОбласти

#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли